package com.proj.hot.utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;

/**
 * Created by zangchenggang on 16/11/15.
 */
public class NetUtil {
    /**
     * 判断网络是否可用
     *
     * @param context
     * @return true可用,false不可用
     */
    public static boolean checkTheNetworkConnection(Context context) { //
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 获取当前的网络状态
     * -1：没有网络/0：WIFI网络/1：wap网络或其它网络/2：2G/3：net网络
     *
     * @param context
     * @return
     */
    public static int getAPNType(Context context) {
        int netType = -1;
        ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        TelephonyManager telephonyManager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        int subType = telephonyManager.getNetworkType();
       // Util.Log(TAG, "telephonyType=" + subType);
        if (networkInfo == null || !networkInfo.isAvailable()) {
           // Util.Log(TAG, "网络类型为空");
            return netType;
        }
        int nType = networkInfo.getType();
        if (nType == ConnectivityManager.TYPE_MOBILE) {
            int NET_2G = 0;
            int NET_3G = 0;
            switch (subType) {
                case TelephonyManager.NETWORK_TYPE_1xRTT:
                    return NET_2G; // ~ 50-100 kbps
                case TelephonyManager.NETWORK_TYPE_CDMA:
                    return NET_2G; // ~ 14-64 kbps
                case TelephonyManager.NETWORK_TYPE_EDGE:
                    return NET_2G; // ~ 50-100 kbps
                case TelephonyManager.NETWORK_TYPE_EVDO_0:
                    return NET_3G; // ~ 400-1000 kbps
                case TelephonyManager.NETWORK_TYPE_EVDO_A:
                    return NET_3G; // ~ 600-1400 kbps
                case TelephonyManager.NETWORK_TYPE_GPRS:
                    return NET_2G; // ~ 100 kbps
                case TelephonyManager.NETWORK_TYPE_HSDPA:
                    return NET_3G; // ~ 2-14 Mbps
                case TelephonyManager.NETWORK_TYPE_HSPA:
                    return NET_3G; // ~ 700-1700 kbps
                case TelephonyManager.NETWORK_TYPE_HSUPA:
                    return NET_3G; // ~ 1-23 Mbps
                case TelephonyManager.NETWORK_TYPE_UMTS:
                    return NET_3G; // ~ 400-7000 kbps
                // NOT AVAILABLE YET IN API LEVEL 7
                // case Connectivity.NETWORK_TYPE_EHRPD:
                // return NET_3G; // ~ 1-2 Mbps
                // case Connectivity.NETWORK_TYPE_EVDO_B:
                // return NET_3G; // ~ 5 Mbps
                // case Connectivity.NETWORK_TYPE_HSPAP:
                // return NET_3G; // ~ 10-20 Mbps
                // case Connectivity.NETWORK_TYPE_IDEN:
                // return NET_2G; // ~25 kbps
                // case Connectivity.NETWORK_TYPE_LTE:
                // return NET_3G; // ~ 10+ Mbps
                // Unknown
                case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                    return NET_2G;
                default:
                    return NET_2G;
            }
        } else if (nType == ConnectivityManager.TYPE_WIFI) {
            int NET_WIFI = 0;
            netType = NET_WIFI;
        }
        return netType;
    }
    /**
     * android.permission.ACCESS_NETWORK_STATE(权限) 手机网络进行详细区分： info.getSubtype()
     * 这里使用 getSubtype()，不是 getType()；getType()返回的是0，或者1，是区分是手机网络还是wifi。
     * info.getSubtype()取值列表如下： NETWORK_TYPE_CDMA 网络类型为CDMA NETWORK_TYPE_EDGE
     * 网络类型为EDGE NETWORK_TYPE_EVDO_0 网络类型为EVDO0 NETWORK_TYPE_EVDO_A 网络类型为EVDOA
     * NETWORK_TYPE_GPRS 网络类型为GPRS NETWORK_TYPE_HSDPA 网络类型为HSDPA
     * NETWORK_TYPE_HSPA 网络类型为HSPA NETWORK_TYPE_HSUPA 网络类型为HSUPA
     * NETWORK_TYPE_UMTS 网络类型为UMTS
     * 联通的3G为UMTS或HSDPA，移动和联通的2G为GPRS或EGDE，电信的2G为CDMA，电信的3G为EVDO
     *
     * @param context
     * @return 返回-1没有网络、0为wifi网络、2为2G网络、3为3G网络
     */
    public static int getNetworkType(Context context) {
        NetworkInfo info = (NetworkInfo) ((ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE))
                .getActiveNetworkInfo();
        int type = 0;
        if (info != null) {
            //Util.Log(TAG, "有网");
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {// 手机网络
                //Util.Log(TAG, "TYPE_MOBILE");
                if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS
                        || info.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE) {// 移动和联通的2G
                    //Util.Log(TAG, "移动和联通的2G");
                    type = 2;
                }
                if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA) {// 电信的2G
                   // Util.Log(TAG, "电信的2G");
                    type = 2;
                }
                if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_EVDO_0) {// 电信的3G
                    //Util.Log(TAG, "电信的3G");
                    type = 3;
                }
                if (info.getSubtype() == TelephonyManager.NETWORK_TYPE_UMTS
                        || info.getSubtype() == TelephonyManager.NETWORK_TYPE_HSDPA) {// 联通的3G
                    //Util.Log(TAG, "联通的3G");
                    type = 3;
                }
            } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {// wifi网络
                //Util.Log(TAG, "TYPE_WIFI");
                type = 0;
            }
        } else {
           // Util.Log(TAG, "没网");
            type = -1;
        }
        if (type >= 0) {// 有网>=0
            if (type == 0) {// wifi 0
                return type;
            } else if (type == 2) {// 2G网络2
                return type;
            } else if (type == 3) {// 3G网络3
                return type;
            }
        } else {// 没网-1
            return type;
        }
        return type;
    }
}
